from typing import List, Dict
from flask import current_app
import json
from app.utils.ollama_client import get_ollama_client
from queue import Queue
from threading import Lock
import time

class SemanticSplitter:
    """语义增强分割器"""
    
    _instance = None
    _lock = Lock()
    _request_queue = Queue()
    
    @staticmethod
    def split(text: str) -> List[str]:
        """使用 AI 模型进行语义分割"""
        system_prompt = """
        你是一个专业的内容处理大师。请帮我分析以下文本，并按照语义完整性将其拆分成多个片段。
        要求：
        1. 每个片段应该是语义完整的
        2. 保持上下文的连贯性
        3. 避免过长或过短的片段
        4. 尽量在自然的语义边界处断开
        5. 确保每个片段都能独立理解
        请直接返回分割后的片段列表，每个片段用 ---SPLIT--- 分隔。
        """
        
        try:
            # 获取 Ollama 客户端
            client = get_ollama_client()
            
            # 发送请求
            response = client.chat(
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": text}
                ],
                stream=False  # 不使用流式响应
            )
            
            result = response.json()
            content = result['message']['content']
            
            # 分割内容
            chunks = [chunk.strip() for chunk in content.split('---SPLIT---') if chunk.strip()]
            return chunks
            
        except Exception as e:
            current_app.logger.error(f"Semantic splitting error: {str(e)}")
            raise

class QASplitter:
    """问答对分割器"""
    
    @staticmethod
    def split(text: str) -> List[Dict[str, str]]:
        """将文本转换为问答对形式"""
        system_prompt = """
        你是一个专业的内容分析师。请将以下文本转换成一系列的问答对。
        要求：
        1. 提取关键信息点，转换为问题和答案的形式
        2. 问题要简洁明确，答案要完整准确
        3. 确保问答对涵盖文本的主要内容
        4. 保持专业性和准确性
        5. 每个问答对用 ---QA--- 分隔
        6. 每个问答对的格式为：Q: 问题\nA: 答案
        
        请直接返回问答对列表，不要添加其他内容。
        """
        
        try:
            # 获取 Ollama 客户端
            client = get_ollama_client()
            
            # 发送请求
            response = client.chat(
                messages=[
                    {"role": "system", "content": system_prompt},
                    {"role": "user", "content": text}
                ],
                stream=False
            )
            
            result = response.json()
            content = result['message']['content']
            
            # 解析问答对
            qa_pairs = []
            for qa_text in content.split('---QA---'):
                qa_text = qa_text.strip()
                if not qa_text:
                    continue
                    
                parts = qa_text.split('\n', 1)
                if len(parts) == 2:
                    question = parts[0].replace('Q:', '').strip()
                    answer = parts[1].replace('A:', '').strip()
                    qa_pairs.append({
                        'question': question,
                        'answer': answer
                    })
            
            return qa_pairs
            
        except Exception as e:
            current_app.logger.error(f"QA splitting error: {str(e)}")
            raise 